<?php

abstract class Crud_Event_Handler
{
	/**
	 * Array of available types of event.
	 * @var array
	 */
	protected $_availableTypes = array(
		'preDispatchEdit',
		'preSave',
		'preValidation',
		'postSave',
		'postLoadRow',
		'form',
		'preSelect',
		'postSelect',
		'postFetch',
		'preDelete',
	);
	
	/**
	 * Type of handler.
	 * @var string
	 */
	protected $_type;
	
	/**
	 * Return type of handler.
	 * 
	 * @return string
	 */
	public function getType()
	{
		if (!in_array($this->_type, $this->_availableTypes)) {
			throw new Crud_Exception("Event type does not exists: `{$this->_type}`");
		}
		
		return $this->_type;
	}
	
    /**
     * Get an action parameter
     *
     * @param string $key
     * @param mixed $default Default value to use if key not found
     * @return mixed
     */
    protected function _getParam($key, $default = null)
	{
		return Zend_Controller_Front::getInstance()->getRequest()->getParam($key, $default);
	}
	
    /**
     * Set an action parameter
     *
     * A $value of null will unset the $key if it exists
     *
     * @param string $key
     * @param mixed $value
     * @return Zend_Controller_Request_Abstract
     */
    protected function _setParam($key, $value)
	{
		return Zend_Controller_Front::getInstance()->getRequest()->setParam($key, $value);
	}
	
	/**
	 * Возвращает объект AdminUserRow текущего залогинненного пользователя.
	 * 
	 * @return AdminUserRow
	 */
	protected function _getAdminUser()
	{
		$login = Zend_Auth::getInstance()->getIdentity();
		$peer = AdminUserPeer::getInstance();
		$user = $peer->findByLogin($login)->current();
		if (!$user instanceof AdminUserRow) {
			throw new Exception('Неизвестная ошибка. Не удалется получить объект текущего пользователя');
		}
		
		return $user;
	}
	
	/**
	 * Run handler with options array.
	 * 
	 * @param mixed $options
	 * @return void
	 */
	abstract public function run($options);
}
